<?php

/**
 * 验证
 * 
 * @package    01CMS
 * @subpackage system
 * @author     rolong at vip.qq.com
 * @version    1.0.0
 * @link       http://www.01cms.com
 */

class Filter
{

    /**
     * 检查Email地址
     * 
     * @param string $value
     * @return bool
     */
    public static function isEmail ($value)
    {
        return preg_match('/^([a-zA-Z0-9]|[._])+@([a-zA-Z0-9_-])+(\.[a-zA-Z0-9_-])+/', $value);
    }

    /**
     * 检查6-20位不含空格密码的格式
     *
     * @param string $value
     * @return bool
     */
    public static function isPwd ($value)
    {
        return preg_match('/^[^\s]{6,20}$/', $value);
    }

    /*
 	* 检查用户名的格式
 	* 4-20字母、数字、下划线或减号的组合, 首字符必须为字母或数字
 	*/
    public static function isName ($value)
    {
        return preg_match('/^[A-Za-z0-9][A-Za-z0-9_\-]{3,19}$/', $value);
    }

    /**
     * 日期
     * 支持格式 2009-5-1 2009/5/1 2009-05-01 2009/05/01 2009.1.1 2009.01.01
     * @param string $value
     * @return bool
     */
    public static function isDateTime ($value)
    {
        return preg_match('/^((((1[6-9]|[2-9]\d)\d{2})(\-|\/|\.)(0?[13578]|1[02])(\-|\/|\.)(0?[1-9]|[12]\d|3[01]))|(((1[6-9]|[2-9]\d)\d{2})(\-|\/|\.)(0?[13456789]|1[012])(\-|\/|\.)(0?[1-9]|[12]\d|30))|(((1[6-9]|[2-9]\d)\d{2})(\-|\/|\.)0?2(\-|\/|\.)(0?[1-9]|1\d|2[0-8]))|(((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))(\-|\/|\.)0?2(\-|\/|\.)29))$/', $value);
    }

    /*
	 *  检查数字
	 */
    public static function isNumber ($value)
    {
        return preg_match('/^([+-]?)\d*\.?\d+$/', $value);
    }

    /**
     * 检验字符串格式是否是1,2,3,4这种格式
     */
    public static function isDotStr ($value)
    {
        return preg_match("/^([0-9]+,)+$/", $value . ","); //偷懒了，补上咯逗号
    }

    /**
     * 将字符串格式化为1,2,3,4这种形式
     *
     * @param mix $value
     * @return string
     */
    public static function formatdot ($value)
    {
        $value = preg_replace("/[^\d]+/", ",", $value);
        $value = preg_replace("/^,|,$/", "", $value);
        return $value;
    }

    /**
     * 检查URL链接
     * 支持格式 http://www.01cms.com https://www.01cms.com ftp://www.01cms.com www.01cms.com
     * 
     * @param string $value
     * @return bool
     */
    public static function isURL ($value)
    {
        return preg_match('/^((http[s]?|ftp)\:\/\/)?([a-z0-9][a-z0-9\-]+\.)?[a-z0-9][a-z0-9\-]+[a-z0-9](\.[a-z]{2,4})+(\/[a-z0-9\.\,\-\_\%\?\=\&]?)?$/i', $value);
    }

    /**
     * 检查是否为中文
     *
     * @param string $value
     * @return string
     */
    public static function isChinese ($value)
    {
        return preg_match('/^[\x7f-\xff]+$/', $value);
    }

    /**
     * 检查身份证
     * 15 位的：以一位数字1-9开头，后面是14位数字
     * 18位的：以一位数字1-9开头，后面是16位数字，最后一位是[0-9x]
     *
     * @param string $value
     * @return bool
     */
    public static function isCard ($value)
    {
        return preg_match('/^[1-9]([0-9]{14}|[0-9]{16}[0-9x])$/i', $value);
    }

    /**
     * utf-8下字符串长度
     *
     * @param string $str
     * @return int
     */
    public static function len ($str)
    {
        $count = 0;
        for ($i = 0; $i < strlen($str); $i ++)
        {
            $value = ord($str[$i]);
            if ($value > 127)
            {
                $count ++;
                if ($value >= 192 && $value <= 223)
                    $i ++;
                elseif ($value >= 224 && $value <= 239)
                    $i = $i + 2;
                elseif ($value >= 240 && $value <= 247)
                    $i = $i + 3;
                else
                    die('Not a UTF-8 compatible string');
            }
            $count ++;
        }
        return $count;
    }

    /**
     * 检验真实姓名
     *
     * @param string $name
     * @return bool
     */
    public static function isRealName ($name)
    {
        if (strlen(trim($name)) < 2 || strlen(trim($name)) > 10)
        {
            return false;
        }
        for ($i = 0; $i < strlen($name); $i ++)
        {
            if (ord(substr($name, $i, 1)) <= 0xa0)
            {
                return false;
            }
        }
        return true;
    }
}